diff -u chntpw-140201.orig/ntreg.c chntpw-140201/ntreg.c
--- chntpw-140201.orig/ntreg.c	2019-06-22 13:09:59.583717369 -0700
+++ chntpw-140201/ntreg.c	2019-06-22 13:16:26.714726148 -0700
@@ -4241,10 +4241,13 @@
   do {  /* On some platforms read may not block, and read in chunks. handle that */
     r = read(hdesc->filedesc, hdesc->buffer + rt, hdesc->size - rt);
     rt += r;
-  } while ( !errno && (rt < hdesc->size) );
+  } while ( r > 0 && (rt < hdesc->size) );
 
-  if (errno) { 
-    perror("openHive(): read error: ");
+  if (r <= 0) { 
+    if (r < 0)
+      perror("openHive(): read error");
+    else
+      fprintf(stderr, "openHive(): read error: unexpected EOF\n");
     closeHive(hdesc);
     return(NULL);
   }
@@ -4255,10 +4258,10 @@
     return(NULL);
   }
 
-  if (r < sizeof (*hdesc)) {
+  if (rt < sizeof (*hdesc)) {
     fprintf(stderr,
-	    "file is too small; got %d bytes while expecting %d or more\n",
-	    r, sizeof (*hdesc));
+	    "file is too small; got %d bytes while expecting %zu or more\n",
+	    rt, sizeof (*hdesc));
     closeHive(hdesc);
     return(NULL);
   }
